package condominio.DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.excepcion.DAOExcepcion;
import condominio.modelo.Visita;
import condominio.util.ConexionBD;

public class VisitaDAO extends BaseDAO{

	
	
public Visita insertar(Visita vo) throws DAOExcepcion {
    String query = "insert into Visita(DniVisitante,NombreVisitante,Vivienda, FechaVisita) values (?,?,?,?)";
    Connection con = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, vo.getDnivisita());
            stmt.setString(2, vo.getNombrevisita());
            stmt.setInt(3, vo.getVivienda());
            stmt.setString(4, vo.getFechavisita());
            int i = stmt.executeUpdate();
            if (i != 1) {
                    throw new SQLException("No se pudo insertar");
            }
            

    } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
    } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
    }
    return vo;
}

public Visita obtener(int codigoVisita) throws DAOExcepcion {
	Visita vo = new Visita();
    Connection con = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
            String query = "select CodigoVisita,DniVisitante, NombreVisitante, Vivienda,FechaVisita from Visita  where CodigoVisita=?";
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, codigoVisita);
            rs = stmt.executeQuery();
            if (rs.next()) {
                    
            	vo.setCodvisita(rs.getInt(1));
                vo.setDnivisita(rs.getInt(2));
                vo.setNombrevisita(rs.getString(3));
                vo.setVivienda(rs.getInt(4));
                vo.setFechavisita(rs.getString(5));
            	
            	            }
    } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
    } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
    }
    return vo;
}

public void eliminar(int idCategoria) throws DAOExcepcion {
    String query = "delete from Visita WHERE CodigoVisita=?";
    Connection con = null;
    PreparedStatement stmt = null;
    try {
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, idCategoria);
            int i = stmt.executeUpdate();
            if (i != 1) {
                    throw new SQLException("No se pudo eliminar");
            }
    } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
    } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
    }
}

public Collection<Visita> listar() throws DAOExcepcion {
    Collection<Visita> c = new ArrayList<Visita>();
    Connection con = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
            con = ConexionBD.obtenerConexion();
            String query = "select CodigoVisita,DniVisitante, NombreVisitante, Vivienda,FechaVisita from Visita order by Vivienda";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            while (rs.next()) {
                    Visita vo = new Visita();
                    vo.setCodvisita(rs.getInt("CodigoVisita"));
                    vo.setDnivisita(rs.getInt("DniVisitante"));
                    vo.setNombrevisita(rs.getString("NombreVisitante"));
                    vo.setVivienda(rs.getInt("Vivienda"));
                    vo.setFechavisita(rs.getString("FechaVisita"));
                    c.add(vo);
            }

    } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
    } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
    }
    return c;
}
public Collection<Visita> listarPorResidente(String CodigoResidente) throws DAOExcepcion {
    Collection<Visita> c = new ArrayList<Visita>();
    Connection con = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    try {
            con = ConexionBD.obtenerConexion();
            String query = "select visita.CodigoVisita,visita.DniVisitante, visita.NombreVisitante, visita.Vivienda,visita.FechaVisita from visita" + 
            			"INNER JOIN vivienda as vi on vi.CodigoVivienda = visita.Vivienda " + 
            			"INNER JOIN residente as re on re.CodigoResidente = vi.Residente " +
            			"where re.DocumentoIdentidad = ? " +
            			"order by CodigoVisita";	
            stmt = con.prepareStatement(query);
            stmt.setString(1, CodigoResidente);
            rs = stmt.executeQuery();
            while (rs.next()) {
                    Visita vo = new Visita();
                    vo.setCodvisita(rs.getInt("CodigoVisita"));
                    vo.setDnivisita(rs.getInt("DniVisitante"));
                    vo.setNombrevisita(rs.getString("NombreVisitante"));
                    vo.setFechavisita(rs.getString("FechaVisita"));
                    vo.setVivienda(rs.getInt("vivienda"));
                    c.add(vo);
            }

    } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
    } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
    }
    return c;
}


}
